﻿using System.Collections.Generic;
using System.Threading;

namespace MVC.OA.Common
{
    public class LogHelper
    {
        //定义日志队列
        public static Queue<string> ExceptionQueue = new Queue<string>();
        //定义日志观察者
        public static List<ILogWriter> LogWriterList = new List<ILogWriter>();

        static LogHelper()
        {
            //将要观察的对象写入集合
            //如果要将日志文件写入多个地方 如数据库 或者txt文本或者其他
            //LogWriterList.Add(new SqlServerWriter());
            LogWriterList.Add(new Log4NetWriter());

            //把从队列中获取错误消息写入日志文件中去 使用线程池定时操作
            ThreadPool.QueueUserWorkItem(a =>
            {
                while (true)
                {
                    lock (ExceptionQueue)
                    {
                        if (ExceptionQueue.Count > 0)
                        {
                            string str = ExceptionQueue.Dequeue();
                            //把异常信息 写到  日志文件里面去。
                            //变化点：有可能写到日志文件，有可能写到数据库里面去。有可能两个地方都写。
                            //只要需要将日志文件写到哪个地方，就添加一个类继承日志器方法
                            foreach (var item in LogWriterList)
                            {
                                item.WriptLogInfo(str);
                            }
                        }
                        else
                        {
                            Thread.Sleep(50);
                        }
                    }
                }

            });
        }
        public static void WriteLog(string exceptionText)
        {
            lock (ExceptionQueue)
            {
                ExceptionQueue.Enqueue(exceptionText);
                //if (ExceptionStringQueue.Count > 100)
                //{
                //    //......
                //}
            }
        }
    }
}